Linux vbd hotplug: Avoid "leaked" loopback devices
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 3 Nov 2009 08:38:55 +0000 (08:38 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 3 Nov 2009 08:38:55 +0000 (08:38 +0000)
Avoid races between hotplug "add" and "remove" leading to "leaked"
loopback devices.

- Don't setup loopback device if xend is no longer waiting for the
  vbd.
- Use the lock file to avoid add/remove races.

Signed-off-by: Gary Grebus <gary.grebus@oracle.com>
tools/hotplug/Linux/block

index f50eeda56308e15df5c282583abd4f771079828a..171a4fca2a5aad742c1457e67777fd001bb876bd 100644 (file)
@@ -233,6 +233,15 @@ case "$command" in
 
         claim_lock "block"
 
+        # Avoid a race with the remove if the path has been deleted, or
+       # otherwise changed from "InitWait" state e.g. due to a timeout
+        xenbus_state=$(xenstore_read_default "$XENBUS_PATH/state" 'unknown')
+        if [ "$xenbus_state" != '2' ]
+        then
+          release_lock "block"
+          fatal "Path closed or removed during hotplug add: $XENBUS_PATH state: $xenbus_state"
+        fi
+
         if [ "$mode" = 'w' ] && ! stat "$file" -c %A | grep -q w
         then
           release_lock "block"
@@ -363,8 +372,10 @@ mount it read-write in a guest domain."
        ;;
 
       file)
+        claim_lock "block"
         node=$(xenstore_read "$XENBUS_PATH/node")
        losetup -d "$node"
+        release_lock "block"
        exit 0
        ;;